iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
Software Development

用python做一個X11 WM系列 第 3

Day 3|基本Xlib結構(?

  • 分享至 

  • xImage
  •  

這是我原本repo裡的main.py

import subprocess
from Xlib.display import Display
from Xlib import X, XK
dpy = Display()
screen = dpy.screen()
root = screen.root
root.grab_key(dpy.keysym_to_keycode(XK.string_to_keysym("z")),X.Mod4Mask|X.Mod2Mask,1,X.GrabModeAsync,X.GrabModeAsync)
root.grab_key(dpy.keysym_to_keycode(XK.string_to_keysym("q")),X.Mod4Mask|X.Mod2Mask,X.ShiftMask,1,X.GrabModeAsync,X.GrabModeAsync)

def call_rofi():
    if ev.type==X.KeyPress:
        #print(f"press key:{ev.detail}")
        if ev.detail==dpy.keysym_to_keycode(XK.string_to_keysym("z")):
            subprocess.Popen(["rofi","-show","drun"])
def kill_window():
    if ev.type==X.KeyPress:
        if ev.detail==dpy.keysym_to_keycode(XK.string_to_keysym("q")):
            window.kill_client()
while True:
    ev=dpy.next_event()
    call_rofi()
    kill_window()
    dpy.flush()

大多都ai生的
所以我想打掉重練 重開一個main.py
這是我忙一天的結果 最後也都ai教我

from Xlib import display,X,XK
dpy=display.Display()
screen=dpy.screen()
root=screen.root
#註冊事件
screen.root.grab_key(dpy.keysym_to_keycode(XK.string_to_keysym("q")),X.Mod4Mask,1,X.GrabModeAsync, X.GrabModeAsync)
#cursor=root.create_font_cursor(0) <--滑鼠顯示不出來
#cursor=dpy.create_resource_object("cursor")
#root.define_cursor(cursor)
while True:
    event=dpy.next_event()
    if event.type==X.KeyPress:
        if event.detail==dpy.keysym_to_keycode(XK.string_to_keysym("q")):
            X.kill_client(dpy)
    dpy.flush()

其實看整體架構很像GUI的事件循環 像是QT,Tkinter

因為python-xlib的文檔不完整,內容很少
像是我看tinywm裡面有screen().root但python-xlib文檔裡面沒有寫,所以一路從pydoc追到dir()

zixgggg@watermelon:~/i4$ uv python -m pydoc python-xlib
error: unexpected argument '-m' found

Usage: uv python [OPTIONS] <COMMAND>

For more information, try '--help'.
zixgggg@watermelon:~/i4$ uv run python -m pydoc python-xlib
No Python documentation found for 'python-xlib'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib

zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display

zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.diszixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.screen
No Python documentation found for 'Xlib.display.screen'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.screen()
bash: 未預期的字組「(」附近有語法錯誤
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.screen()
bash: 未預期的字組「(」附近有語法錯誤
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.screen

zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.

zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display

zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.screen.root
No Python documentation found for 'Xlib.display.Display.screen.root'.
Use help() to get the interactive help utility.
Use help(str) for help on the str class.
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.screen.root()
bash: 未預期的字組「(」附近有語法錯誤
zixgggg@watermelon:~/i4$ uv run python -m pydoc Xlib.display.Display.screen

zixgggg@watermelon:~/i4$ uv run python
Python 3.13.5 (main, Jun 25 2025, 18:55:22) [GCC 14.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> uv run python -m pydoc Xlib.display.Display.screen
  File "<python-input-0>", line 1
    uv run python -m pydoc Xlib.display.Display.screen
       ^^^
SyntaxError: invalid syntax
>>> from Xlib.display import Display
>>> dir(Display.screen)
['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__getstate__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__type_params__']
>>> help(Display.screen)

>>> dpy = Display()
>>> scr = dpy.screen()
>>> dir(scr)
['__class__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', '_data']
>>> scr._data.keys()
dict_keys(['root', 'default_colormap', 'white_pixel', 'black_pixel', 'current_input_mask', 'width_in_pixels', 'height_in_pixels', 'width_in_mms', 'height_in_mms', 'min_installed_maps', 'max_installed_maps', 'root_visual', 'backing_store', 'save_unders', 'root_depth', 'allowed_depths'])
>>> scr.root_data.keys()
Traceback (most recent call last):
  File "/home/zixgggg/i4/.venv/lib/python3.13/site-packages/Xlib/protocol/rq.py", line 1293, in __getattr__
    return self._data[attr]
           ~~~~~~~~~~^^^^^^
KeyError: 'root_data'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<python-input-8>", line 1, in <module>
    scr.root_data.keys()
    ^^^^^^^^^^^^^
  File "/home/zixgggg/i4/.venv/lib/python3.13/site-packages/Xlib/protocol/rq.py", line 1297, in __getattr__
    raise AttributeError(attr)
AttributeError: root_data
>>>

我就查到dir(scr)而已,我對python底層不熟,scr._data.keys()是ai跟我講的
help(Display.screen)裡面只有:

Help on function screen in module Xlib.display:

screen(self, sno=None)

uv run python -m pydoc Xlib.display.Display.screen裡面:

Help on function screen in Xlib.display.Display:

Xlib.display.Display.screen = screen(self, sno=None)

看完上面的記錄就說明了Xlib為何複雜,不僅是X11本身協議極其繁瑣,python的綁定文檔不周全,真要查就只能去看複雜難懂的Xlib C API 我就是不想寫C才用python阿 都用py幹嘛還看C文檔
文檔不全這個問題我特別去註冊stackoverflow問(對我以前都沒有在用SO),目前問題還在審核,出來了我再更新文章
我目前的感想是xlib仿佛就像是一個黑盒子 網路上沒什麼教學 那些大佬又不知道在沒有ai和文檔的情況下知道那些函式 好像他們會通靈一樣


上一篇
Day 2|環境配置
下一篇
Day 4|顯示鼠標(我要瘋了
系列文
用python做一個X11 WM14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言